package com.xyazm.order.domain.param;

import lombok.Data;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;

/**
 * 创建订单参数
 * @author xuyou
 * @date 2022年04月14日 21:44
 */
@Data
public class CreateOrderParam {

    /**
     * 订单号
     */
    @NotEmpty(message = "订单号不能为空")
    private String orderId;
    /**
     * 业务线标识
     */
    @NotNull(message = "业务线标识不能为空")
    private Integer businessIdentifier;

    /**
     * 微信openid
     */
    private String openid;

    /**
     * 用户id
    */
    @NotEmpty(message = "用户id不能为空")
    private String userId;



    /**
     * 订单类型
     */
    @NotNull(message = "订单类型不能为空")
    private Integer orderType;

    /**
     * 卖家ID
     */
    @NotEmpty(message = "卖家ID不能为空")
    private String sellerId;

    /**
     * 用户备注
     */
    private String userRemark;

    /**
     * 优惠券id
    */
    private String couponId;

    // 下单客户端信息，主要用于风控检查
    /**
     * 客户端ip
     */
    @NotEmpty(message = "客户端ip不能为空")
    private String clientIp;

    /**
     * 设备编号
     */
    @NotEmpty(message = "设备编号不能为空")
    private String deviceId;
    /**
     *  订单地址信息
    */
    @NotNull(message = "订单地址信息不能为空")
    private OrderAddressParam orderAddressParam;
    /**
     *  订单条目信息
    */
    @NotEmpty(message = "订单条目信息不能为空")
    private List<OrderItemParam> orderItemParamList;
    /**
     * 订单费用信息
     */
    @NotEmpty(message = "订单费用信息不能为空")
    private List<OrderAmountParam> orderAmountParamList;
    /**
     * 订单支付信息
     */
    @NotEmpty(message = "订单支付信息不能为空")
    private List<OrderPaymentParam> orderPaymentParamList;


    /**
     * 订单收货地址信息
     */
    @Data
    public static class OrderAddressParam implements Serializable {

        private static final long serialVersionUID = -8189987703740512851L;

        /**
         * 配送方式
         */
        @NotNull(message = "配送方式不能为空")
        private Integer deliveryType;
        /**
         * 省
         */
        @NotEmpty(message = "省不能为空")
        private String province;
        /**
         * 市
         */
        @NotEmpty(message = "市不能为空")
        private String city;
        /**
         * 区
         */
        @NotEmpty(message = "区不能为空")
        private String area;
        /**
         * 街道
         */
        @NotEmpty(message = "街道不能为空")
        private String street;
        /**
         * 详细地址
         */
        private String detailAddress;
        /**
         * 经度
         */
        @NotNull(message = "经度不能为空")
        private BigDecimal lon;
        /**
         * 纬度
         */
        @NotNull(message = "纬度不能为空")
        private BigDecimal lat;
        /**
         * 收货人姓名
         */
        @NotEmpty(message = "收货人姓名不能为空")
        private String receiverName;
        /**
         * 收货人电话
         */
        @NotEmpty(message = "收货人电话不能为空")
        private String receiverPhone;
        /**
         * 用户收货地址id
         */
        private String userAddressId;
        /**
         * 地区编码
         */
        private String addressCode;
        /**
         * 区域ID
         */
        private String regionId;
        /**
         * 配送区域ID
         */
        private String shippingAreaId;
    }


    /**
     * 订单条目信息
     */
    @Data
    public static class OrderItemParam  implements Serializable {

        private static final long serialVersionUID = 8267460170612816097L;
        /**
         * 商品类型
         */
        @NotNull(message = "商品类型不能为空")
        private Integer productType;
        /**
         * sku编号
         */
        @NotEmpty(message = "sku编号不能为空")
        private String skuCode;
        /**
         * 销售数量
         */
        @NotNull(message = "销售数量不能为空")
        private Integer saleQuantity;
    }

    /**
     * 订单费用信息
     */
    @Data
    public static class OrderAmountParam implements Serializable {

        private static final long serialVersionUID = -8189987703740512851L;
        /**
         * 费用类型
         */
        @NotNull(message = "费用类型不能为空")
        private Integer amountType;
        /**
         * 费用金额
         */
        @NotNull(message = "费用金额不能为空")
        private Integer amount;
    }

    /**
     * 订单支付信息
     */
    @Data
    public static class OrderPaymentParam implements Serializable {

        private static final long serialVersionUID = -1821079125013490176L;
        /**
         * 支付类型
         */
        @NotNull(message = "支付类型不能为空")
        private Integer payType;
        /**
         * 账户类型
         */
        @NotNull(message = "账户类型不能为空")
        private Integer accountType;
        /**
         * 支付金额
         */
        @NotNull(message = "支付金额不能为空")
        private Integer payAmount;
    }

}
